﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Data;
using Npgsql;
using NpgsqlTypes;
using MillerApp.DataContract.Common.Entity;

namespace MillerApp.CommonLib.DataAccess
{
    public class PostgreSqlDBHelper:DBHelper
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="providerInvariantName"></param>
        public PostgreSqlDBHelper(string connectionString, string providerInvariantName)
            :base(connectionString,providerInvariantName)
        {
        }

        /// <summary>
        /// 获取数据库服务提供工厂实例
        /// </summary>
        /// <param name="providerInvariantName"></param>
        /// <returns></returns>
        public override DbProviderFactory GetDbProviderFactory()
        {
            return Npgsql.NpgsqlFactory.Instance;
        }

        public override IDbDataParameter GetDbDataParameter(string nativeType, string parameterName, object parameterValue)
        {
            if (string.IsNullOrEmpty(nativeType))
            {
                nativeType = string.Empty;
            }
            nativeType = nativeType.ToLower().Trim();
            List<KeyValueEntry> mappingList = new List<KeyValueEntry>();
            mappingList.Add(new KeyValueEntry("bigint", "Bigint"));

            NpgsqlDbType dbType = NpgsqlDbType.Varchar;
            //switch (nativeType)
            //{
            //    case "[???]":
            //        dbType = NpgsqlDbType.Array;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Bigint;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Boolean;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Box;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Bytea;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Circle;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Char;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Date;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Double;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Integer;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Line;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.LSeg;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Money;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Numeric;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Path;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Point;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Polygon;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Real;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Smallint;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Text;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Time;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Timestamp;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Varchar;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Refcursor;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Inet;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Bit;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.TimestampTZ;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Uuid;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Xml;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Oidvector;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Interval;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.TimeTZ;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Name;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.Abstime;
            //        break;
            //    case "bigint":
            //        dbType = NpgsqlDbType.MacAddr;
            //        break;
            //    default:
            //        dbType = NpgsqlDbType.Varchar;
            //        break;
            //}
            IDbDataParameter para = new NpgsqlParameter(parameterName, dbType);
            para.Value = parameterValue;
            return para;
        }
    }
}
